home *** CD-ROM | disk | FTP | other *** search
/ SuperHack / SuperHack CD.bin / CODING / CPP / WFC010.ZIP / SRC / CNETWKST.CPP < prev    next >
C/C++ Source or Header  |  1995-12-07  |  19KB  |  737 lines

  1. #include <wfc.h>
  2. #pragma hdrstop
  3.  
  4. /*
  5. ** Author: Samuel R. Blackburn
  6. ** CI$: 76300,326
  7. ** Internet: sammy@sed.csc.com
  8. **
  9. ** You can use it any way you like as long as you don't try to sell it.
  10. **
  11. ** Any attempt to sell WFC in source code form must have the permission
  12. ** of the original author. You can produce commercial executables with
  13. ** WFC but you can't sell WFC.
  14. **
  15. ** Copyright, 1995, Samuel R. Blackburn
  16. **
  17. ** $Workfile: $
  18. ** $Revision: $
  19. ** $Modtime: $
  20. */
  21.  
  22. #if defined( _DEBUG )
  23. #undef THIS_FILE
  24. static char BASED_CODE THIS_FILE[] = __FILE__;
  25. #endif
  26.  
  27. IMPLEMENT_SERIAL( CWorkstationUser, CObject, 1 )
  28. IMPLEMENT_SERIAL( CWorkstationInformation, CObject, 1 )
  29. IMPLEMENT_SERIAL( CWorkstationTransport, CObject, 1 )
  30. IMPLEMENT_SERIAL( CNetWorkstation, CNetwork, 1 )
  31.  
  32. #if defined( _DEBUG )
  33. #define new DEBUG_NEW
  34. #endif
  35.  
  36. /*
  37. ** CWorkstationUser stuff
  38. */
  39.  
  40. CWorkstationUser::CWorkstationUser()
  41. {
  42.    m_Initialize();
  43. }
  44.  
  45. /*
  46. ** Can't make Copy take a const pointer because Microsoft screwed up the 
  47. ** net API header files...
  48. */
  49.  
  50. CWorkstationUser::CWorkstationUser( WKSTA_USER_INFO_1 *source )
  51. {
  52.    Copy( source );
  53. }
  54.  
  55. CWorkstationUser::CWorkstationUser( const CWorkstationUser& source )
  56. {
  57.    Copy( source );
  58. }
  59.  
  60. CWorkstationUser::~CWorkstationUser()
  61. {
  62.    m_Initialize();
  63. }
  64.  
  65. /*
  66. ** Can't make Copy take a const pointer because Microsoft screwed up the 
  67. ** net API header files...
  68. */
  69.  
  70. void CWorkstationUser::Copy( WKSTA_USER_INFO_1 *source )
  71. {
  72.    ASSERT( source != NULL );
  73.  
  74.    if ( source == NULL )
  75.    {
  76.       m_Initialize();
  77.       return;
  78.    }
  79.  
  80. #if ! defined( UNICODE )
  81.    ::UNICODE_to_ASCII( (LPCWSTR) source->wkui1_username,     source->wkui1_username     );
  82.    ::UNICODE_to_ASCII( (LPCWSTR) source->wkui1_logon_domain, source->wkui1_logon_domain );
  83.    ::UNICODE_to_ASCII( (LPCWSTR) source->wkui1_oth_domains,  source->wkui1_oth_domains  );
  84.    ::UNICODE_to_ASCII( (LPCWSTR) source->wkui1_logon_server, source->wkui1_logon_server );
  85. #endif
  86.  
  87.    UserName     = source->wkui1_username;
  88.    LogonDomain  = source->wkui1_logon_domain;
  89.    OtherDomains = source->wkui1_oth_domains;
  90.    LogonServer  = source->wkui1_logon_server;
  91.  
  92. #if ! defined( UNICODE )
  93.    ::ASCII_to_UNICODE( source->wkui1_username,     (LPWSTR) source->wkui1_username     );
  94.    ::ASCII_to_UNICODE( source->wkui1_logon_domain, (LPWSTR) source->wkui1_logon_domain );
  95.    ::ASCII_to_UNICODE( source->wkui1_oth_domains,  (LPWSTR) source->wkui1_oth_domains  );
  96.    ::ASCII_to_UNICODE( source->wkui1_logon_server, (LPWSTR) source->wkui1_logon_server );
  97. #endif
  98. }
  99.  
  100. void CWorkstationUser::Copy( const CWorkstationUser& source )
  101. {
  102.    ASSERT( this != &source );
  103.  
  104.    /*
  105.    ** Make sure we ain't copying ourselves
  106.    */
  107.  
  108.    if ( this == &source )
  109.    {
  110.       return;
  111.    }
  112.  
  113.    UserName     = source.UserName;
  114.    LogonDomain  = source.LogonDomain;
  115.    OtherDomains = source.OtherDomains;
  116.    LogonServer  = source.LogonServer;
  117. }
  118.  
  119. void CWorkstationUser::Empty( void )
  120. {
  121.    m_Initialize();
  122. }
  123.  
  124. void CWorkstationUser::m_Initialize( void )
  125. {
  126.    UserName.Empty();
  127.    LogonDomain.Empty();
  128.    OtherDomains.Empty();
  129.    LogonServer.Empty();
  130. }
  131.  
  132. void CWorkstationUser::Serialize( CArchive& archive )
  133. {
  134.    CObject::Serialize( archive );
  135.  
  136.    if ( archive.IsStoring() )
  137.    {
  138.       archive << UserName;
  139.       archive << LogonDomain;
  140.       archive << OtherDomains;
  141.       archive << LogonServer;
  142.    }
  143.    else
  144.    {
  145.       archive >> UserName;
  146.       archive >> LogonDomain;
  147.       archive >> OtherDomains;
  148.       archive >> LogonServer;
  149.    }
  150. }
  151.  
  152. /*
  153. ** CWorkstationInformation stuff
  154. */
  155.  
  156. CWorkstationInformation::CWorkstationInformation()
  157. {
  158.    m_Initialize();
  159. }
  160.  
  161. /*
  162. ** Can't make Copy take a const pointer because Microsoft screwed up the 
  163. ** net API header files...
  164. */
  165.  
  166. CWorkstationInformation::CWorkstationInformation( WKSTA_INFO_100 *source )
  167. {
  168.    Copy( source );
  169. }
  170.  
  171. CWorkstationInformation::CWorkstationInformation( WKSTA_INFO_101 *source )
  172. {
  173.    Copy( source );
  174. }
  175.  
  176. CWorkstationInformation::CWorkstationInformation( const CWorkstationInformation& source )
  177. {
  178.    Copy( source );
  179. }
  180.  
  181. CWorkstationInformation::~CWorkstationInformation()
  182. {
  183.    m_Initialize();
  184. }
  185.  
  186. /*
  187. ** Can't make Copy take a const pointer because Microsoft screwed up the 
  188. ** net API header files...
  189. */
  190.  
  191. void CWorkstationInformation::Copy( WKSTA_INFO_100 *source )
  192. {
  193.    ASSERT( source != NULL );
  194.  
  195.    if ( source == NULL )
  196.    {
  197.       m_Initialize();
  198.       return;
  199.    }
  200.  
  201. #if ! defined( UNICODE )
  202.    ::UNICODE_to_ASCII( (LPCWSTR) source->wki100_computername, source->wki100_computername );
  203.    ::UNICODE_to_ASCII( (LPCWSTR) source->wki100_langroup,     source->wki100_langroup     );
  204. #endif
  205.  
  206.    PlatformID            = source->wki100_platform_id;
  207.    ComputerName          = source->wki100_computername;
  208.    LANGroup              = source->wki100_langroup;
  209.    MajorVersion          = source->wki100_ver_major;
  210.    MinorVersion          = source->wki100_ver_minor;
  211.    LANRoot.Empty();;
  212.    NumberOfLoggedOnUsers = 0;
  213.  
  214. #if ! defined( UNICODE )
  215.    ::ASCII_to_UNICODE( source->wki100_computername, (LPWSTR) source->wki100_computername );
  216.    ::ASCII_to_UNICODE( source->wki100_langroup,     (LPWSTR) source->wki100_langroup     );
  217. #endif
  218. }
  219.  
  220. /*
  221. ** Can't make Copy take a const pointer because Microsoft screwed up the 
  222. ** net API header files...
  223. */
  224.  
  225. void CWorkstationInformation::Copy( WKSTA_INFO_101 *source )
  226. {
  227.    ASSERT( source != NULL );
  228.  
  229.    if ( source == NULL )
  230.    {
  231.       m_Initialize();
  232.       return;
  233.    }
  234.  
  235. #if ! defined( UNICODE )
  236.    ::UNICODE_to_ASCII( (LPCWSTR) source->wki101_computername, source->wki101_computername );
  237.    ::UNICODE_to_ASCII( (LPCWSTR) source->wki101_langroup,     source->wki101_langroup     );
  238.    ::UNICODE_to_ASCII( (LPCWSTR) source->wki101_lanroot,      source->wki101_lanroot      );
  239. #endif
  240.  
  241.    PlatformID            = source->wki101_platform_id;
  242.    ComputerName          = source->wki101_computername;
  243.    LANGroup              = source->wki101_langroup;
  244.    MajorVersion          = source->wki101_ver_major;
  245.    MinorVersion          = source->wki101_ver_minor;
  246.    LANRoot               = source->wki101_lanroot;
  247.    NumberOfLoggedOnUsers = 0;
  248.  
  249. #if ! defined( UNICODE )
  250.    ::ASCII_to_UNICODE( source->wki101_computername, (LPWSTR) source->wki101_computername );
  251.    ::ASCII_to_UNICODE( source->wki101_langroup,     (LPWSTR) source->wki101_langroup     );
  252.    ::ASCII_to_UNICODE( source->wki101_lanroot,      (LPWSTR) source->wki101_lanroot      );
  253. #endif
  254. }
  255.  
  256. /*
  257. ** Can't make Copy take a const pointer because Microsoft screwed up the 
  258. ** net API header files...
  259. */
  260.  
  261. void CWorkstationInformation::Copy( WKSTA_INFO_102 *source )
  262. {
  263.    ASSERT( source != NULL );
  264.  
  265.    if ( source == NULL )
  266.    {
  267.       m_Initialize();
  268.       return;
  269.    }
  270.  
  271. #if ! defined( UNICODE )
  272.    ::UNICODE_to_ASCII( (LPCWSTR) source->wki102_computername, source->wki102_computername );
  273.    ::UNICODE_to_ASCII( (LPCWSTR) source->wki102_langroup,     source->wki102_langroup     );
  274.    ::UNICODE_to_ASCII( (LPCWSTR) source->wki102_lanroot,      source->wki102_lanroot      );
  275. #endif
  276.  
  277.    PlatformID            = source->wki102_platform_id;
  278.    ComputerName          = source->wki102_computername;
  279.    LANGroup              = source->wki102_langroup;
  280.    MajorVersion          = source->wki102_ver_major;
  281.    MinorVersion          = source->wki102_ver_minor;
  282.    LANRoot               = source->wki102_lanroot;
  283.    NumberOfLoggedOnUsers = source->wki102_logged_on_users;
  284.  
  285. #if ! defined( UNICODE )
  286.    ::ASCII_to_UNICODE( source->wki102_computername, (LPWSTR) source->wki102_computername );
  287.    ::ASCII_to_UNICODE( source->wki102_langroup,     (LPWSTR) source->wki102_langroup     );
  288.    ::ASCII_to_UNICODE( source->wki102_lanroot,      (LPWSTR) source->wki102_lanroot      );
  289. #endif
  290. }
  291.  
  292. void CWorkstationInformation::Copy( const CWorkstationInformation& source )
  293. {
  294.    ASSERT( this != &source );
  295.  
  296.    /*
  297.    ** Make sure we ain't copying ourselves
  298.    */
  299.  
  300.    if ( this == &source )
  301.    {
  302.       return;
  303.    }
  304.  
  305.    PlatformID            = source.PlatformID;
  306.    ComputerName          = source.ComputerName;
  307.    LANGroup              = source.LANGroup;
  308.    MajorVersion          = source.MajorVersion;
  309.    MinorVersion          = source.MinorVersion;
  310.    LANRoot               = source.LANRoot;
  311.    NumberOfLoggedOnUsers = source.NumberOfLoggedOnUsers;
  312. }
  313.  
  314. void CWorkstationInformation::Empty( void )
  315. {
  316.    m_Initialize();
  317. }
  318.  
  319. void CWorkstationInformation::m_Initialize( void )
  320. {
  321.    PlatformID            = 0;
  322.    ComputerName.Empty();
  323.    LANGroup.Empty();
  324.    MajorVersion          = 0;
  325.    MinorVersion          = 0;
  326.    LANRoot.Empty();
  327.    NumberOfLoggedOnUsers = 0;
  328. }
  329.  
  330. void CWorkstationInformation::Serialize( CArchive& archive )
  331. {
  332.    CObject::Serialize( archive );
  333.  
  334.    if ( archive.IsStoring() )
  335.    {
  336.       archive << PlatformID;
  337.       archive << ComputerName;
  338.       archive << LANGroup;
  339.       archive << MajorVersion;
  340.       archive << MinorVersion;
  341.       archive << LANRoot;
  342.       archive << NumberOfLoggedOnUsers;
  343.    }
  344.    else
  345.    {
  346.       archive >> PlatformID;
  347.       archive >> ComputerName;
  348.       archive >> LANGroup;
  349.       archive >> MajorVersion;
  350.       archive >> MinorVersion;
  351.       archive >> LANRoot;
  352.       archive >> NumberOfLoggedOnUsers;
  353.    }
  354. }
  355.  
  356. /*
  357. ** CWorkstationTransport stuff
  358. */
  359.  
  360. CWorkstationTransport::CWorkstationTransport()
  361. {
  362.    m_Initialize();
  363. }
  364.  
  365. CWorkstationTransport::CWorkstationTransport( WKSTA_TRANSPORT_INFO_0 *source )
  366. {
  367.    Copy( source );
  368. }
  369.  
  370. CWorkstationTransport::CWorkstationTransport( const CWorkstationTransport& source )
  371. {
  372.    Copy( source );
  373. }
  374.  
  375. CWorkstationTransport::~CWorkstationTransport()
  376. {
  377.    m_Initialize();
  378. }
  379.  
  380. /*
  381. ** Can't make Copy take a const pointer because Microsoft screwed up the 
  382. ** net API header files...
  383. */
  384.  
  385. void CWorkstationTransport::Copy( WKSTA_TRANSPORT_INFO_0 *source )
  386. {
  387.    ASSERT( source != NULL );
  388.  
  389.    if ( source == NULL )
  390.    {
  391.       m_Initialize();
  392.       return;
  393.    }
  394.  
  395. #if ! defined( UNICODE )
  396.    ::UNICODE_to_ASCII( (LPCWSTR) source->wkti0_transport_name,    source->wkti0_transport_name    );
  397.    ::UNICODE_to_ASCII( (LPCWSTR) source->wkti0_transport_address, source->wkti0_transport_address );
  398. #endif
  399.  
  400.    QualityOfService        = source->wkti0_quality_of_service;
  401.    NumberOfVirtualCircuits = source->wkti0_number_of_vcs;
  402.    Name                    = source->wkti0_transport_name;
  403.    Address                 = source->wkti0_transport_address;
  404.    WANish                  = source->wkti0_wan_ish;
  405.  
  406. #if ! defined( UNICODE )
  407.    ::ASCII_to_UNICODE( source->wkti0_transport_name,    (LPWSTR) source->wkti0_transport_name    );
  408.    ::ASCII_to_UNICODE( source->wkti0_transport_address, (LPWSTR) source->wkti0_transport_address );
  409. #endif
  410. }
  411.  
  412. void CWorkstationTransport::Copy( const CWorkstationTransport& source )
  413. {
  414.    ASSERT( this != &source );
  415.  
  416.    /*
  417.    ** Make sure we ain't copying ourselves
  418.    */
  419.  
  420.    if ( this == &source )
  421.    {
  422.       return;
  423.    }
  424.  
  425.    QualityOfService        = source.QualityOfService;
  426.    NumberOfVirtualCircuits = source.NumberOfVirtualCircuits;
  427.    Name                    = source.Name;
  428.    Address                 = source.Address;
  429.    WANish                  = source.WANish;
  430. }
  431.  
  432. void CWorkstationTransport::Empty( void )
  433. {
  434.    m_Initialize();
  435. }
  436.  
  437. void CWorkstationTransport::m_Initialize( void )
  438. {
  439.    QualityOfService        = 0;
  440.    NumberOfVirtualCircuits = 0;
  441.    Name.Empty();
  442.    Address.Empty();
  443.    WANish = FALSE;
  444. }
  445.  
  446. void CWorkstationTransport::Serialize( CArchive& archive )
  447. {
  448.    CObject::Serialize( archive );
  449.  
  450.    DWORD temp_value = 0;
  451.  
  452.    if ( archive.IsStoring() )
  453.    {
  454.       archive << QualityOfService;
  455.       archive << NumberOfVirtualCircuits;
  456.       archive << Name;
  457.       archive << Address;
  458.  
  459.       temp_value = WANish;
  460.       archive << temp_value;
  461.    }
  462.    else
  463.    {
  464.       archive >> QualityOfService;
  465.       archive >> NumberOfVirtualCircuits;
  466.       archive >> Name;
  467.       archive >> Address;
  468.       archive >> temp_value;
  469.       WANish = (BOOL) temp_value;
  470.    }
  471. }
  472.  
  473. /*
  474. ** CNetWorkstation Stuff
  475. */
  476.  
  477. CNetWorkstation::CNetWorkstation()
  478. {
  479.    m_Initialize();
  480. }
  481.  
  482. CNetWorkstation::CNetWorkstation( LPCTSTR machine_name )
  483. {
  484.    m_Initialize();
  485.    Open( machine_name );
  486. }
  487.  
  488. CNetWorkstation::~CNetWorkstation()
  489. {
  490.    Close();
  491. }
  492.  
  493. void CNetWorkstation::Close( void )
  494. {
  495.    CNetwork::Close();
  496.  
  497.    if ( m_InformationBuffer100 != NULL )
  498.    {
  499.       ::NetApiBufferFree( m_InformationBuffer100 );
  500.       m_InformationBuffer100 = NULL;
  501.    }
  502.  
  503.    if ( m_InformationBuffer101 != NULL )
  504.    {
  505.       ::NetApiBufferFree( m_InformationBuffer101 );
  506.       m_InformationBuffer101 = NULL;
  507.    }
  508.  
  509.    if ( m_InformationBuffer102 != NULL )
  510.    {
  511.       ::NetApiBufferFree( m_InformationBuffer102 );
  512.       m_InformationBuffer102 = NULL;
  513.    }
  514.  
  515.    if ( m_TransportBuffer != NULL )
  516.    {
  517.       ::NetApiBufferFree( m_TransportBuffer );
  518.       m_TransportBuffer = NULL;
  519.    }
  520.  
  521.    if ( m_UserBuffer != NULL )
  522.    {
  523.       ::NetApiBufferFree( m_UserBuffer );
  524.       m_UserBuffer = NULL;
  525.    }
  526.  
  527.    m_TransportBuffer      = NULL;
  528.    m_UserBuffer           = NULL;
  529. }
  530.  
  531. void CNetWorkstation::m_Initialize( void )
  532. {
  533.    m_ErrorCode                     = 0;
  534.    m_InformationBuffer100          = NULL;
  535.    m_InformationBuffer101          = NULL;
  536.    m_InformationBuffer102          = NULL;
  537.    m_TransportBuffer               = NULL;
  538.    m_TransportResumeHandle         = 0;
  539.    m_TransportCurrentEntryNumber   = 0;
  540.    m_TransportNumberOfEntriesRead  = 0;
  541.    m_TransportTotalNumberOfEntries = 0;
  542.    m_UserBuffer                    = NULL;
  543.    m_UserResumeHandle              = NULL;
  544.    m_UserCurrentEntryNumber        = NULL;
  545.    m_UserNumberOfEntriesRead       = NULL;
  546.    m_UserTotalNumberOfEntries      = NULL;
  547. }
  548.  
  549. BOOL CNetWorkstation::EnumerateInformation( void )
  550. {
  551.    if ( m_InformationBuffer100 != NULL )
  552.    {
  553.       ::NetApiBufferFree( m_InformationBuffer100 );
  554.       m_InformationBuffer100 = NULL;
  555.    }
  556.  
  557.    if ( m_InformationBuffer101 != NULL )
  558.    {
  559.       ::NetApiBufferFree( m_InformationBuffer101 );
  560.       m_InformationBuffer101 = NULL;
  561.    }
  562.  
  563.    if ( m_InformationBuffer102 != NULL )
  564.    {
  565.       ::NetApiBufferFree( m_InformationBuffer102 );
  566.       m_InformationBuffer102 = NULL;
  567.    }
  568.  
  569.    m_ErrorCode = ::NetWkstaGetInfo( (LPTSTR) m_WideMachineName, 102, (LPBYTE *) &m_InformationBuffer102 );
  570.  
  571.    if ( m_ErrorCode == ERROR_ACCESS_DENIED )
  572.    {
  573.       m_ErrorCode = ::NetWkstaGetInfo( (LPTSTR) m_WideMachineName, 101, (LPBYTE *) &m_InformationBuffer101 );
  574.  
  575.       if ( m_ErrorCode == ERROR_ACCESS_DENIED )
  576.       {
  577.          m_ErrorCode = ::NetWkstaGetInfo( (LPTSTR) m_WideMachineName, 100, (LPBYTE *) &m_InformationBuffer100 );
  578.  
  579.          if ( m_ErrorCode != NERR_Success || m_InformationBuffer100 == NULL )
  580.          {
  581.             return( FALSE );
  582.          }
  583.       }
  584.       else if ( m_ErrorCode != NERR_Success || m_InformationBuffer101 == NULL )
  585.       {
  586.          return( FALSE );
  587.       }
  588.    }
  589.    else if ( m_ErrorCode != NERR_Success || m_InformationBuffer102 == NULL )
  590.    {
  591.       return( FALSE );
  592.    }
  593.  
  594.    return( TRUE );
  595. }
  596.  
  597. BOOL CNetWorkstation::EnumerateTransports( void )
  598. {
  599.    ::NetApiBufferFree( m_TransportBuffer );
  600.    m_TransportBuffer = NULL;
  601.  
  602.    m_TransportCurrentEntryNumber   = 0;
  603.    m_TransportNumberOfEntriesRead  = 0;
  604.    m_TransportResumeHandle         = 0;
  605.    m_TransportTotalNumberOfEntries = 0;
  606.  
  607.    m_ErrorCode = ::NetWkstaTransportEnum( (LPTSTR) m_WideMachineName, 
  608.                                                    0, 
  609.                                        (LPBYTE *) &m_TransportBuffer,
  610.                                                    65536,
  611.                                                   &m_TransportNumberOfEntriesRead,
  612.                                                   &m_TransportTotalNumberOfEntries,
  613.                                                   &m_TransportResumeHandle );
  614.  
  615.    if ( m_ErrorCode != NERR_Success || m_TransportBuffer == NULL || m_TransportNumberOfEntriesRead == 0 )
  616.    {
  617.       return( FALSE );
  618.    }
  619.  
  620.    return( TRUE );
  621. }
  622.  
  623. BOOL CNetWorkstation::EnumerateUsers( void )
  624. {
  625.    ::NetApiBufferFree( m_UserBuffer );
  626.    m_UserBuffer = NULL;
  627.  
  628.    m_UserCurrentEntryNumber   = 0;
  629.    m_UserNumberOfEntriesRead  = 0;
  630.    m_UserTotalNumberOfEntries = 0;
  631.    m_UserResumeHandle         = 0;
  632.  
  633.    m_ErrorCode = ::NetWkstaUserEnum( (LPTSTR) m_WideMachineName, 
  634.                                      1, 
  635.                          (LPBYTE *) &m_UserBuffer,
  636.                                      65536,
  637.                                     &m_UserNumberOfEntriesRead,
  638.                                     &m_UserTotalNumberOfEntries,
  639.                                     &m_UserResumeHandle );
  640.  
  641.    if ( m_ErrorCode != NERR_Success || m_UserBuffer == NULL || m_UserNumberOfEntriesRead == 0 )
  642.    {
  643.       return( FALSE );
  644.    }
  645.  
  646.    return( TRUE );
  647. }
  648.  
  649. BOOL CNetWorkstation::GetCurrentUser( CWorkstationUser& information )
  650. {
  651.    WKSTA_USER_INFO_1 *buffer = NULL;
  652.  
  653.    m_ErrorCode = ::NetWkstaUserGetInfo( NULL, 1, (LPBYTE *) &buffer );
  654.  
  655.    if ( m_ErrorCode != NERR_Success || buffer == NULL )
  656.    {
  657.       information.Empty();
  658.       return( FALSE );
  659.    }
  660.  
  661.    information.Copy( buffer );
  662.  
  663.    ::NetApiBufferFree( buffer );
  664.  
  665.    return( TRUE );
  666. }
  667.  
  668. BOOL CNetWorkstation::GetNext( CWorkstationInformation& information )
  669. {
  670.    if ( m_InformationBuffer100 != NULL )
  671.    {
  672.       information.Copy( m_InformationBuffer100 );
  673.       ::NetApiBufferFree( m_InformationBuffer100 );
  674.       m_InformationBuffer100 = NULL;
  675.       return( TRUE );
  676.    }
  677.  
  678.    if ( m_InformationBuffer101 != NULL )
  679.    {
  680.       information.Copy( m_InformationBuffer101 );
  681.       ::NetApiBufferFree( m_InformationBuffer101 );
  682.       m_InformationBuffer101 = NULL;
  683.       return( TRUE );
  684.    }
  685.  
  686.    if ( m_InformationBuffer102 != NULL )
  687.    {
  688.       information.Copy( m_InformationBuffer102 );
  689.       ::NetApiBufferFree( m_InformationBuffer102 );
  690.       m_InformationBuffer102 = NULL;
  691.       return( TRUE );
  692.    }
  693.  
  694.    information.Empty();
  695.    return( FALSE );
  696. }
  697.  
  698. BOOL CNetWorkstation::GetNext( CWorkstationTransport& information )
  699. {
  700.    if ( m_TransportCurrentEntryNumber < m_TransportTotalNumberOfEntries )
  701.    {
  702.       information.Copy( &m_TransportBuffer[ m_TransportCurrentEntryNumber ] );
  703.       m_TransportCurrentEntryNumber++;
  704.       return( TRUE );
  705.    }
  706.  
  707.    information.Empty();
  708.    return( FALSE );
  709. }
  710.  
  711. BOOL CNetWorkstation::GetNext( CWorkstationUser& information )
  712. {
  713.    if ( m_UserCurrentEntryNumber < m_UserTotalNumberOfEntries )
  714.    {
  715.       information.Copy( &m_UserBuffer[ m_UserCurrentEntryNumber ] );
  716.       m_UserCurrentEntryNumber++;
  717.       return( TRUE );
  718.    }
  719.  
  720.    information.Empty();
  721.    return( FALSE );
  722. }
  723.  
  724. void CNetWorkstation::Serialize( CArchive& archive )
  725. {
  726.    CNetwork::Serialize( archive );
  727.  
  728.    if ( archive.IsStoring() )
  729.    {
  730.       archive << m_ErrorCode;
  731.    }
  732.    else
  733.    {
  734.       archive >> m_ErrorCode;
  735.    }
  736. }
  737.